package maxinshiSomeipTool20.common.itfSafeSWT;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;

/**
 * 增强版SWT GUI通用工具类
 * 封装组件创建、布局管理、弹窗提示、样式设置等常用操作，支持一行调用
 */
public class SwtGuiComm {

	public static Combo createLabeledCombo(Composite parent, String labelText, String[] items) {
        Label label = new Label(parent, SWT.NONE);
        label.setText(labelText);

        Combo combo = new Combo(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
        combo.setItems(items);
        combo.select(0); // 默认选第一个
        combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        return combo;
    }

    public static Spinner createLabeledSpinner(Composite parent, String labelText, int min, int max) {
        Label label = new Label(parent, SWT.NONE);
        label.setText(labelText);

        Spinner spinner = new Spinner(parent, SWT.BORDER);
        spinner.setMinimum(min);
        spinner.setMaximum(max);
        spinner.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        return spinner;
    }

    public static Table createLabeledTable(Composite parent, String labelText, String[] columnNames, int style) {
        Label label = new Label(parent, SWT.NONE);
        label.setText(labelText);

        Table table = new Table(parent, style);
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        for (String columnName : columnNames) {
            TableColumn column = new TableColumn(table, SWT.NONE);
            column.setText(columnName);
        }

        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        return table;
    }
    
    public static Button createLabeledCheckbox(Composite parent, String labelText) {
        Label label = new Label(parent, SWT.NONE);
        label.setText(labelText);

        Button checkbox = new Button(parent, SWT.CHECK);
        checkbox.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        return checkbox;
    }
	
	public static Text createLabeledReadOnly(Composite parent, String labelText, String defaultValue) {
        Label label = new Label(parent, SWT.NONE);
        label.setText(labelText);

        Text text = new Text(parent, SWT.BORDER | SWT.READ_ONLY);
        text.setText(defaultValue);
        text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        return text;
    }

    public static Text createLabeledText(Composite parent, String labelText) {
        Label label = new Label(parent, SWT.NONE);
        label.setText(labelText);

        Text text = new Text(parent, SWT.BORDER);
        text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
        return text;
    }
	
    // 移到 SwtGuiComm 的“组件管理工具”部分
    public static boolean setComboSelection(Combo combo, int index) {
        if (combo == null || combo.isDisposed()) return false;
        int itemCount = combo.getItemCount();
        if (index == -1) {
            combo.deselectAll();
            return true;
        }
        if (index >= 0 && index < itemCount) {
            combo.select(index);
            return true;
        }
        return false;
    }

    /**
     * （新增）安全设置Combo选中项（处理null和索引越界）
     */
    public static void setComboSelectionEx(Combo combo, int index) {
        if (combo == null || combo.isDisposed()) return;
        if (index >= 0 && index < combo.getItemCount()) {
            combo.select(index);
        }
    }

    public static boolean setComboSelectionAndDrop(Combo combo, int index) {
        if (!setComboSelection(combo, index)) return false;
        // 异步展开，避免UI阻塞
        combo.getDisplay().asyncExec(() -> {
            if (!combo.isDisposed()) combo.setListVisible(true);
        });
        return true;
    }
    
    // ====================== 1. 布局管理工具（原有，不变） ======================
    public static void setGridLayout(Composite comp) {
        setGridLayout(comp, 1, 0, 0, 0, 0);
    }
    
    /**
     * 为Composite组件设置GridLayout布局，并统一配置布局参数
     * 用于简化重复的GridLayout初始化代码，确保布局风格一致性
     * 
     * @param comp              目标Composite组件（需要设置布局的容器）
     * @param numColumns        布局的列数（≥1，例如2表示两列布局）
     * @param marginWidth       容器的水平外边距（容器边缘与内部组件的水平距离，单位：像素）
     * @param marginHeight      容器的垂直外边距（容器边缘与内部组件的垂直距离，单位：像素）
     * @param horizontalSpacing 组件之间的水平间距（同一行中相邻组件的水平距离，单位：像素）
     * @param verticalSpacing   组件之间的垂直间距（同一列中相邻组件的垂直距离，单位：像素）
     * 
     * @note 1. 若目标组件为null或已释放（disposed），方法会直接返回，避免空指针或SWT异常
     * @note 2. GridLayout是SWT中最常用的布局之一，支持行列布局，适合大多数表单、列表类界面
     * @note 3. 列数（numColumns）建议根据实际需求设置，例如表单常用2列（标签+输入框）
     * 
     * 使用示例：
     * // 为面板设置2列布局，外边距10px，组件间距5px
     * Composite formPanel = new Composite(parent, SWT.NONE);
     * SWTLayoutUtils.setGridLayout(
     *     formPanel,    // 目标容器
     *     2,            // 2列
     *     10,           // 水平外边距10px
     *     10,           // 垂直外边距10px
     *     5,            // 组件水平间距5px
     *     5             // 组件垂直间距5px
     * );
     * // 后续向formPanel添加的组件会自动按2列布局排列
     */
    public static void setGridLayout(Composite comp, int numColumns, 
                                     int marginWidth, int marginHeight, 
                                     int horizontalSpacing, int verticalSpacing) {
        if (comp == null || comp.isDisposed()) return;
        
        GridLayout layout = new GridLayout(numColumns, false);
        layout.marginWidth = marginWidth;
        layout.marginHeight = marginHeight;
        layout.horizontalSpacing = horizontalSpacing;
        layout.verticalSpacing = verticalSpacing;
        comp.setLayout(layout);
    }

    public static void setGridLayoutEx(Composite comp) {
    	GridLayout commonLayout = new GridLayout(2, false);
        // 内边距：上下20，左右20，与动态区分开
        commonLayout.marginLeft = 20;
        commonLayout.marginTop = 20;
        commonLayout.marginRight = 20;
        commonLayout.marginBottom = 10;
        commonLayout.horizontalSpacing = 15;
        commonLayout.verticalSpacing = 15;
        comp.setLayout(commonLayout);
    }

    public static void setFillLayout(Composite comp) {
        if (comp == null || comp.isDisposed()) return;
        comp.setLayout(new FillLayout());
    }

    public static void setGridData(Control control, boolean grabHorizontal, boolean grabVertical) {
        if (control == null || control.isDisposed()) return;

        GridData gridData = new GridData();
        gridData.grabExcessHorizontalSpace = grabHorizontal;
        gridData.grabExcessVerticalSpace = grabVertical;
        gridData.horizontalAlignment = grabHorizontal ? GridData.FILL : GridData.CENTER;
        gridData.verticalAlignment = grabVertical ? GridData.FILL : GridData.CENTER;
        control.setLayoutData(gridData);
    }

    public static void setGridDataWithWidth(Control control, int widthHint) {
        setGridData(control, false, false);
        GridData gridData = (GridData) control.getLayoutData();
        gridData.widthHint = widthHint;
    }

    public static void setGridDataWithHeight(Control control, int heightHint) {
        setGridData(control, true, false);
        GridData gridData = (GridData) control.getLayoutData();
        gridData.heightHint = heightHint;
    }

    public static void refreshLayout(Composite comp) {
        if (comp == null || comp.isDisposed()) return;
        comp.layout(true, true);
        if (comp.getParent() != null && !comp.getParent().isDisposed()) {
            comp.getParent().layout(true, true);
        }
    }


    // ====================== 2. 组件创建工具（修正createText方法，移除setStyle） ======================
    /**
     * （原有）创建带滚动的容器
     */
    public static ScrolledComposite createScrolledComposite(Composite parent, int style) {
        if (parent == null || parent.isDisposed()) return null;
        
        int finalStyle = (style == 0) ? (SWT.BORDER | SWT.V_SCROLL) : style;
        ScrolledComposite scrolledComp = new ScrolledComposite(parent, finalStyle);
        scrolledComp.setExpandHorizontal(true);
        scrolledComp.setExpandVertical(true);
        setGridData(scrolledComp, true, true);
        return scrolledComp;
    }

    /**
     * （原有）创建内容容器（配合滚动容器使用）
     */
    public static Composite createContentComposite(Composite parent) {
        if (parent == null || parent.isDisposed()) return null;
        
        Composite contentComp = new Composite(parent, SWT.NONE);
        setGridLayout(contentComp);
        return contentComp;
    }

    /**
     * （原有）绑定内容容器到滚动容器
     */
    public static void bindContentToScrolled(ScrolledComposite scrolledComp, Composite contentComp) {
        if (scrolledComp == null || contentComp == null || scrolledComp.isDisposed() || contentComp.isDisposed()) {
            return;
        }
        scrolledComp.setContent(contentComp);
        scrolledComp.setMinSize(contentComp.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        refreshLayout(scrolledComp);
    }

    /**
     * （原有）创建按钮（带事件绑定）
     */
    public static Button createButton(Composite parent, String text, SelectionAdapter listener) {
        if (parent == null || parent.isDisposed()) return null;
        
        Button btn = new Button(parent, SWT.PUSH);
        btn.setText(text);
        if (listener != null) {
            btn.addSelectionListener(listener);
        }
        setGridData(btn, true, false);
        return btn;
    }

    /**
     * （原有）创建标签（支持换行）
     */
    public static Label createLabel(Composite parent, String text, int style) {
        if (parent == null || parent.isDisposed()) return null;
        
        Label label = new Label(parent, style | SWT.WRAP);
        label.setText(text);
        setGridData(label, true, false);
        return label;
    }

    /**
     * （修正）创建文本输入框（支持多行、密码框、固定宽高）
     * 关键修改：构造Text时提前组合样式，不使用setStyle（SWT不支持动态修改样式）
     * @param parent 父容器
     * @param style 文本框样式（如 SWT.MULTI=多行, SWT.PASSWORD=密码框, SWT.READ_ONLY=只读）
     * @param widthHint 固定宽度（0=自适应）
     * @param heightHint 固定高度（0=自适应，多行时建议传值）
     * @param defaultValue 默认文本（可为null）
     * @return Text 组件
     */
    public static Text createText(Composite parent, int style, int widthHint, int heightHint, String defaultValue) {
        if (parent == null || parent.isDisposed()) return null;
        
        // 关键：多行文本框（SWT.MULTI）默认添加垂直滚动（SWT.V_SCROLL），构造时组合样式
        int finalStyle = style;
        if ((style & SWT.MULTI) != 0 && (style & SWT.V_SCROLL) == 0) {
            finalStyle = style | SWT.V_SCROLL; // 提前组合“多行+垂直滚动”样式
        }
        
        // 构造Text时传入最终样式（不再创建后修改）
        Text text = new Text(parent, finalStyle);
        // 设置默认文本（处理null）
        text.setText(defaultValue == null ? "" : defaultValue);
        // 设置布局（宽高优先级：固定值 > 自适应）
        if (widthHint > 0 && heightHint > 0) {
            GridData gridData = new GridData();
            gridData.widthHint = widthHint;
            gridData.heightHint = heightHint;
            gridData.horizontalAlignment = GridData.FILL;
            gridData.verticalAlignment = GridData.FILL;
            text.setLayoutData(gridData);
        } else if (widthHint > 0) {
            setGridDataWithWidth(text, widthHint);
        } else if (heightHint > 0) {
            setGridDataWithHeight(text, heightHint);
        } else {
            setGridData(text, true, false);
        }
        return text;
    }

    /**
     * （新增）创建下拉框（Combo）
     * @param parent 父容器
     * @param style 下拉框样式（如 SWT.READ_ONLY=只读，SWT.DROP_DOWN=可输入）
     * @param items 下拉选项数组（可为null，null时默认空数组）
     * @param defaultSelectIndex 默认选中索引（-1=不选中，超出范围时不选中）
     * @param widthHint 固定宽度（0=自适应）
     * @return Combo 组件
     */
    public static Combo createCombo(Composite parent, int style, String[] items, int defaultSelectIndex, int widthHint) {
        if (parent == null || parent.isDisposed()) return null;
        
        Combo combo = new Combo(parent, style);
        // 设置下拉选项（处理null）
        combo.setItems(items == null ? new String[0] : items);
        // 设置默认选中（校验索引合法性）
        if (defaultSelectIndex >= 0 && defaultSelectIndex < combo.getItemCount()) {
            combo.select(defaultSelectIndex);
        }
        // 设置宽度
        if (widthHint > 0) {
            setGridDataWithWidth(combo, widthHint);
        } else {
            setGridData(combo, true, false);
        }
        return combo;
    }

    /**
     * （新增）创建数值选择器（Spinner）
     * @param parent 父容器
     * @param style Spinner样式（如 SWT.BORDER=边框）
     * @param min 最小值
     * @param max 最大值
     * @param initialValue 初始值
     * @param step 步长（每次点击增减的数值）
     * @param widthHint 固定宽度（0=自适应）
     * @return Spinner 组件
     */
    public static Spinner createSpinner(Composite parent, int style, int min, int max, int initialValue, int step, int widthHint) {
        if (parent == null || parent.isDisposed()) return null;
        
        Spinner spinner = new Spinner(parent, style | SWT.BORDER);
        // 设置数值范围和步长（校验合法性：min <= initial <= max）
        spinner.setMinimum(min);
        spinner.setMaximum(max);
        spinner.setSelection(Math.max(min, Math.min(initialValue, max)));
        spinner.setIncrement(step);
        // 设置宽度
        if (widthHint > 0) {
            setGridDataWithWidth(spinner, widthHint);
        } else {
            setGridData(spinner, true, false);
        }
        return spinner;
    }

    /**
     * 创建分组面板（支持自定义布局列数）
     */
    public static Group createGroup(Composite parent, String text, int numColumns) {
        if (parent == null || parent.isDisposed()) return null;
        
        Group group = new Group(parent, SWT.BORDER);
        group.setText(text);
        setGridLayout(group, numColumns, 10, 10, 5, 5); // 默认边距10，间距5
        setGridData(group, true, false);
        return group;
    }


    /**
     * 在父容器中创建一个「横向填满父容器」的2列子容器
     * 子容器默认配置：2列布局、合理边距与间距，且水平方向撑满父容器，垂直方向自适应内容
     * 
     * @param parent 父容器（必须为非null、未释放的Composite）
     * @return 创建好的2列子容器（父容器无效时返回null）
     * 
     * @note 1. 子容器布局为GridLayout，列数固定为2，默认边距10px，组件间距5px
     * @note 2. 子容器横向会自动填满父容器（随父容器宽度拉伸），垂直方向仅占用自身内容高度
     * @note 3. 适合创建表单类界面（如“标签+输入框”两列布局），直接向子容器添加组件即可自动按2列排列
     */
    public static Composite createTwoColumnFillComposite(Composite parent) {
        if (parent == null || parent.isDisposed()) {
            return null;
        }

        Composite twoColumnComp = new Composite(parent, SWT.NONE);
        setGridLayout(twoColumnComp, 2, 10, 10, 5, 5);
        setGridData(twoColumnComp, true, false);

        return twoColumnComp;
    }
    
    // ====================== 3. 组件管理工具（原有，不变） ======================
    /**
     * （原有）清空容器所有子控件
     */
    public static void clearComposite(Composite comp) {
        if (comp == null || comp.isDisposed()) return;
        
        for (Control control : comp.getChildren()) {
            safeDispose(control);
        }
        refreshLayout(comp);
    }

    /**
     * （原有）安全释放控件
     */
    public static void safeDispose(Control control) {
        if (control != null && !control.isDisposed()) {
            control.dispose();
        }
    }

    /**
     * （原有）启用/禁用容器内所有控件
     */
    public static void setControlsEnabled(Composite comp, boolean enabled) {
        if (comp == null || comp.isDisposed()) return;
        
        for (Control control : comp.getChildren()) {
            if (!control.isDisposed()) {
                control.setEnabled(enabled);
                if (control instanceof Composite) {
                    setControlsEnabled((Composite) control, enabled);
                }
            }
        }
    }

    /**
     * （新增）安全获取Combo选中文本（返回非null）
     */
    public static String getComboSelectedText(Combo combo) {
        if (combo == null || combo.isDisposed()) return "";
        String text = combo.getText();
        return text == null ? "" : text;
    }

    /**
     * （新增）安全设置Spinner数值（处理范围越界）
     */
    public static void setSpinnerValue(Spinner spinner, int value) {
        if (spinner == null || spinner.isDisposed()) return;
        int min = spinner.getMinimum();
        int max = spinner.getMaximum();
        spinner.setSelection(Math.max(min, Math.min(value, max)));
    }

    /**
     * （新增）安全获取Spinner数值（默认0）
     */
    public static int getSpinnerValue(Spinner spinner) {
        if (spinner == null || spinner.isDisposed()) return 0;
        return spinner.getSelection();
    }


    // ====================== 4. 弹窗提示工具（原有，不变） ======================
    public static void showInfoDialog(Shell parent, String title, String message) {
        if (parent == null || parent.isDisposed()) return;
        MessageBox msgBox = new MessageBox(parent, SWT.ICON_INFORMATION | SWT.OK);
        msgBox.setText(title);
        msgBox.setMessage(message);
        msgBox.open();
    }

    public static void showErrorDialog(Shell parent, String title, String message) {
        if (parent == null || parent.isDisposed()) return;
        MessageBox msgBox = new MessageBox(parent, SWT.ICON_ERROR | SWT.OK);
        msgBox.setText(title);
        msgBox.setMessage(message);
        msgBox.open();
    }

    public static boolean showConfirmDialog(Shell parent, String title, String message) {
        if (parent == null || parent.isDisposed()) return false;
        MessageBox msgBox = new MessageBox(parent, SWT.ICON_QUESTION | SWT.YES | SWT.NO);
        msgBox.setText(title);
        msgBox.setMessage(message);
        return msgBox.open() == SWT.YES;
    }


    // ====================== 5. 样式设置工具（原有，不变） ======================
    public static void setBackgroundColor(Control control, int r, int g, int b) {
        if (control == null || control.isDisposed()) return;
        
        Display display = control.getDisplay();
        Color color = new Color(display, r, g, b);
        control.setBackground(color);
        control.addDisposeListener(e -> color.dispose());
    }

    public static void setBoldFont(Control control) {
        if (control == null || control.isDisposed()) return;
        
        Font originalFont = control.getFont();
        FontData[] fontData = originalFont.getFontData();
        for (FontData data : fontData) {
            data.setStyle(SWT.BOLD);
        }
        Font boldFont = new Font(control.getDisplay(), fontData);
        control.setFont(boldFont);
        control.addDisposeListener(e -> boldFont.dispose());
    }

    public static CLabel createStatusLabel(Composite parent) {
        if (parent == null || parent.isDisposed()) return null;
        
        CLabel statusLabel = new CLabel(parent, SWT.LEFT);
        statusLabel.setText("就绪");
        setGridData(statusLabel, true, false);
        return statusLabel;
    }
}